import { Logger, Module, OnModuleInit } from '@nestjs/common';
import { DataSource } from 'typeorm';
import { ConfigService } from '@nestjs/config';
import { DatabaseInitializerService } from './shared/database-initializer.service';
import { SeederService } from './seeder.service';
import { DatabaseInitService } from './database-init.service';
import { Role } from 'src/user/entities/role.entity';
import { User } from 'src/user/entities/user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    // ✅ TypeORM 模块：使用 forRootAsync 初始化连接
    TypeOrmModule.forRootAsync({
      useFactory: (configService: ConfigService) => ({
        type: 'mysql',
        host: configService.get<string>('DB_HOST', 'localhost'),
        port: configService.get<number>('DB_PORT', 3306),
        username: configService.get<string>('DB_USER', 'root'),
        password: configService.get<string>('DB_PASS', 'password'),
        database: configService.get<string>('DB_NAME', 'recipedatabase'),
        entities: [Role, User], // ✅ 你可以手动引入，也可以用 glob（见下方推荐）
        // entities: [__dirname + '/**/*.entity{.ts,.js}'], // ✅ 推荐：自动扫描所有实体（见下面如何启用）
        synchronize: true, // 开发环境可用，生产环境请关闭
        logging: true, // 查看 SQL 输出
        // autoLoadEntities: true, // 如果你用 glob 引入，可以启用这个（但需要配对 entities: [__dirname + '/*.entity.ts']）
      }),
      inject: [ConfigService],
    }),
  ],
  providers: [DatabaseInitializerService, DatabaseInitService, SeederService],
  exports: [],
})
export class DatabaseModule implements OnModuleInit {
  private readonly logger = new Logger(DatabaseModule.name);

  constructor(
    private readonly configService: ConfigService,
    private readonly dbInitService: DatabaseInitService,
    private readonly seederService: SeederService, // 注入 SeederService
  ) {}

  // ✅ 关键：在模块初始化阶段，先确保数据库存在
  async onModuleInit() {
    try {
      this.logger.log('🔧 DatabaseModule: 开始初始化数据库...');
      await this.dbInitService.onModuleInit(); // 调用你的服务，确保数据库已创建
      this.logger.log(
        '✅ DatabaseModule: 数据库初始化完成，可以安全连接 TypeORM',
      );

      this.logger.log('🔗 步骤 2/2: 初始化 TypeORM 并连接数据库...');

      // 🌱 步骤 3/3: 手动调用 SeederService 执行 SQL 文件（建表 / 初始数据）
      this.logger.log('🌱 步骤 3/3: 开始执行数据填充（Seeder）...');
      await this.seederService.onModuleInit(); // ✅ 手动触发种子逻辑
      this.logger.log('✅ 数据填充（Seeder）执行完成！');
    } catch (error) {
      this.logger.error('❌ DatabaseModule 初始化失败:', error);
      throw error; // 可以选择让应用启动失败，或根据业务需求处理
    }
  }
}
